package com.mrogrape.notepad.ui.library;

import com.mrogrape.util.StringUtils;


/**
 * 表示一个库包含对象，它可以是文件，或者是URL。
 * 
 * <p>
 * 包含对象的类型由{@link #getType()}的返回值决定，可以是以下类型之一：
 * <ul>
 * <li> {@link #URL} 包含的是一个URL对象。
 * <li> {@link #FILE} 包含的是一个文件对象。
 * </ul>
 * 如果包含的是一个目录，则库构建器会自动构建目录的结构。
 * 
 * 
 * @author IceSpring
 * @version 1.0
 *
 */
public class Inclusion {

	public static final String URL = "url";
	public static final String FILE = "file";

	private String name;
	private String type;
	private String href;
	private boolean visible;
	private boolean expanded;

	/**
	 * 创建一个包含对象并指定名称，类型，和链接。
	 * 
	 * @param name 该包含对象的名称，不可为空。
	 * @param type 该包含对象的类型，不可为空。
	 * @param href 该包含对象的链接，不可为空。
	 */
	public Inclusion(String name,String type, String href) {

		if(StringUtils.isEmpty(name)||StringUtils.isEmpty(type)||StringUtils.isEmpty(href)){
			throw new IllegalArgumentException("parameters can not be empty");
		}

		this.name = name;
		this.type = type;
		this.href = href;
	}


	/**
	 * 创建一个包含对象并指定名称，类型，链接以及可见性和展开策略。
	 * 
	 * @param name 该包含对象的名称，不可为空。
	 * @param type 该包含对象的类型，不可为空。
	 * @param href 该包含对象的链接，不可为空。
	 * @param visible 该对象是否默认可见，默认为false。
	 * @param expanded 该对象是否默认展开（如果可能），默认为false。
	 */
	public Inclusion(String name, String type, String href, boolean visible, boolean expanded) {

		if(StringUtils.isEmpty(name)||StringUtils.isEmpty(type)||StringUtils.isEmpty(href)){
			throw new IllegalArgumentException("parameters can not be empty");
		}

		this.name = name;
		this.type = type;
		this.href = href;
		this.visible = visible;
		this.expanded = expanded;
	}


	public String getType() {

		return this.type;
	}

	public void setType(String type) {

		this.type = type;
	}

	public String getHref() {

		return this.href;
	}

	public void setHref(String href) {

		this.href = href;
	}

	public boolean isVisible() {

		return this.visible;
	}

	public void setVisible(boolean visible) {

		this.visible = visible;
	}

	public boolean isExpanded() {

		return this.expanded;
	}

	public void setExpanded(boolean expanded) {

		this.expanded = expanded;
	}

	/**
	 * @param name the name to set
	 */
	public void setName(String name) {

		this.name = name;
	}

	/**
	 * @return the name
	 */
	public String getName() {

		return this.name;
	}


	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {

		final int prime = 31;
		int result = 1;
		result = prime * result + ((this.href == null) ? 0 : this.href.hashCode());
		result = prime * result + ((this.name == null) ? 0 : this.name.hashCode());
		result = prime * result + ((this.type == null) ? 0 : this.type.hashCode());
		return result;
	}


	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {

		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (!(obj instanceof Inclusion)) {
			return false;
		}
		Inclusion other = (Inclusion) obj;
		if (this.href == null) {
			if (other.href != null) {
				return false;
			}
		}
		else if (!this.href.equals(other.href)) {
			return false;
		}
		if (this.name == null) {
			if (other.name != null) {
				return false;
			}
		}
		else if (!this.name.equals(other.name)) {
			return false;
		}
		if (this.type == null) {
			if (other.type != null) {
				return false;
			}
		}
		else if (!this.type.equals(other.type)) {
			return false;
		}
		return true;
	}


	@Override
	public String toString() {

		return "Inclusion [name=" + this.name + "]";
	}


}
